/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.Departamento;
import br.jm.acionista.sistema.eao.DepartamentoEao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class DepartamentoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Departamento selectedDepartamento;
    private LazyDataModel<Departamento> lazyModel;
    private DepartamentoEao departamentoJpa;
    private int nTotalReg;
    private EntityManager sessao;
    private boolean disable;

    public DepartamentoBean() {
        departamentoJpa = DepartamentoEao.getInstance();
        selectedDepartamento = new Departamento();
        
        this.disable = true;

        lazyModel = new LazyDataModel<Departamento>() {

            @Override
            public List<Departamento> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<Departamento> lazyDepartamento = new ArrayList<Departamento>();

                try {
                    lazyDepartamento = departamentoJpa.getNative("Departamento", first, pageSize, sortField, sortOrder, filters, null);
                } catch (Exception ex) {
                    Logger.getLogger(DepartamentoBean.class.getName()).log(Level.SEVERE, null, ex);
                }

                if (lazyDepartamento.isEmpty()) {
                    selectedDepartamento = new Departamento();
                    selectedDepartamento.setIdDepartamento(0);
                    selectedDepartamento.setDscDepartamento("NENHUM REGISTRO RETORNADO ...");
                    lazyDepartamento.add(selectedDepartamento);
                }
                return lazyDepartamento;
            }
        };

        nTotalReg = departamentoJpa.getCount("Departamento");
        if (nTotalReg == 0) {
            nTotalReg = 1;
            selectedDepartamento = new Departamento();
        }
        lazyModel.setRowCount(nTotalReg);
    }

    public void inserir(ActionEvent actionEvent) {
        FacesMessage msg = null;


        try {
            selectedDepartamento.setIdDepartamento(null);
            departamentoJpa.create(selectedDepartamento);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Departamento Inserido com Sucesso",
                    selectedDepartamento.getDscDepartamento());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir" + selectedDepartamento.getDscDepartamento(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        FacesMessage msg = null;

        try {
            departamentoJpa.edit(selectedDepartamento);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Departamento Alterado com Sucesso",
                    selectedDepartamento.getDscDepartamento());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedDepartamento.getDscDepartamento(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) throws EaoException {
        FacesMessage msg = null;

        try {
            this.sessao = departamentoJpa.openSessaoLote();
            departamentoJpa.openTransaction(this.sessao);

            departamentoJpa.destroy(selectedDepartamento, "S", this.sessao);

            departamentoJpa.closeTransaction(this.sessao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Departamento Excluido com Sucesso",
                    selectedDepartamento.getDscDepartamento());
        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                departamentoJpa.closeSessao(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedDepartamento.getDscDepartamento(),
                    e.getMessage());
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public LazyDataModel<Departamento> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Departamento> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Departamento getSelectedDepartamento() {
        if (selectedDepartamento == null) {
            selectedDepartamento = new Departamento();
        }
        return selectedDepartamento;
    }

    public void setSelectedDepartamento(Departamento selectedDepartamento) {
        this.selectedDepartamento = selectedDepartamento;
    }
    
    public Departamento novo() {
        this.disable = false;
        this.selectedDepartamento = new Departamento();
        
        return this.selectedDepartamento;
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }
    
    public void onRowSelectDepartamento(SelectEvent event) {
        this.disable = true;
    }
}
